{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# SVM——Diabates\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "#竞赛的评价指标为logloss\n",
    "#from sklearn.metrics import log_loss  \n",
    "#SVM并不能直接输出各类的概率，所以在这个例子中我们用正确率作为模型预测性能的度量\n",
    "from sklearn.metrics import accuracy_score\n",
    "#from sklearn.metrics import confusion_matrix\n",
    "from  sklearn.metrics import classification_report  #Python3下classification_report的导入\n",
    "from  sklearn.metrics import confusion_matrix       #Python3下confusion_matrix的导入\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据 & 数据探索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取数据\n",
    "# path to where the data lies\n",
    "#dpath = './data/'\n",
    "train = pd.read_csv(\"diabetes.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "Pregnancies                 768 non-null int64\n",
      "Glucose                     768 non-null int64\n",
      "BloodPressure               768 non-null int64\n",
      "SkinThickness               768 non-null int64\n",
      "Insulin                     768 non-null int64\n",
      "BMI                         768 non-null float64\n",
      "DiabetesPedigreeFunction    768 non-null float64\n",
      "Age                         768 non-null int64\n",
      "Outcome                     768 non-null int64\n",
      "dtypes: float64(2), int64(7)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>120.894531</td>\n",
       "      <td>69.105469</td>\n",
       "      <td>20.536458</td>\n",
       "      <td>79.799479</td>\n",
       "      <td>31.992578</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>31.972618</td>\n",
       "      <td>19.355807</td>\n",
       "      <td>15.952218</td>\n",
       "      <td>115.244002</td>\n",
       "      <td>7.884160</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>62.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.300000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>30.500000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  120.894531      69.105469      20.536458   79.799479   \n",
       "std       3.369578   31.972618      19.355807      15.952218  115.244002   \n",
       "min       0.000000    0.000000       0.000000       0.000000    0.000000   \n",
       "25%       1.000000   99.000000      62.000000       0.000000    0.000000   \n",
       "50%       3.000000  117.000000      72.000000      23.000000   30.500000   \n",
       "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.000000                768.000000  768.000000  768.000000  \n",
       "mean    31.992578                  0.471876   33.240885    0.348958  \n",
       "std      7.884160                  0.331329   11.760232    0.476951  \n",
       "min      0.000000                  0.078000   21.000000    0.000000  \n",
       "25%     27.300000                  0.243750   24.000000    0.000000  \n",
       "50%     32.000000                  0.372500   29.000000    0.000000  \n",
       "75%     36.600000                  0.626250   41.000000    1.000000  \n",
       "max     67.100000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 各属性的统计特性\n",
    "train.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fb5781f94e0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Target 分布，看看各类样本分布是否均衡\n",
    "sns.countplot(train.Outcome);\n",
    "pyplot.xlabel('Outcome');\n",
    "pyplot.ylabel('Number of occurrences');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "各类样本不均衡。交叉验证对分类任务缺省的是采用StratifiedKFold，在每折采样时根据各类样本按比例采样"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 特征编码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 将类别字符串变成数字\n",
    "# drop ids and get labels\n",
    "y_train = train['Outcome']   #形式为Class_x\n",
    "#y_train = y_train.map(lambda s: s[6:])\n",
    "#y_train = y_train.map(lambda s: int(s)-1)\n",
    "\n",
    "train = train.drop([\"Outcome\"], axis=1)\n",
    "X_train = np.array(train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 初始化特征的标准化器\n",
    "ss_X = StandardScaler()\n",
    "\n",
    "# 分别对训练和测试数据的特征进行标准化处理\n",
    "X_train = ss_X.fit_transform(X_train)\n",
    "#X_test = ss_X.transform(X_test)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/wlq666888/APPs/Anaconda3-5.0.1-Linux-x86_64/Anaconda3-5.0.1/lib/python3.6/site-packages/sklearn/model_selection/_split.py:2026: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 用train_test_split随机选择 20%的数据作为测试集\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train_part, X_val, y_train_part, y_val = train_test_split(X_train, y_train, train_size = 0.8,random_state = 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### default SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#LinearSVC不能得到每类的概率，在Otto数据集要求输出每类的概率，这里只是示意SVM的使用方法\n",
    "#https://xacecask2.gitbooks.io/scikit-learn-user-guide-chinese-version/content/sec1.4.html\n",
    "#1.4.1.2. 得分与概率\n",
    "from sklearn.svm import LinearSVC\n",
    "\n",
    "SVC1 = LinearSVC().fit(X_train_part, y_train_part)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report for classifier LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,\n",
      "     intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n",
      "     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n",
      "     verbose=0):\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.84      0.92      0.88       107\n",
      "          1       0.76      0.62      0.68        47\n",
      "\n",
      "avg / total       0.82      0.82      0.82       154\n",
      "\n",
      "\n",
      "Confusion matrix:\n",
      "[[98  9]\n",
      " [18 29]]\n"
     ]
    }
   ],
   "source": [
    "#在校验集上测试，估计模型性能\n",
    "y_predict = SVC1.predict(X_val)\n",
    "\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\"\n",
    "      % (SVC1, classification_report(y_val, y_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" % confusion_matrix(y_val, y_predict))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到线性模型得到的正确率为80%左右"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 线性SVM正则参数调优"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线性SVM LinearSVC的需要调整正则超参数包括C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和正则函数penalty（L2/L1） \n",
    "\n",
    "采用交叉验证，网格搜索步骤与Logistic回归正则参数处理类似，在此略。\n",
    "\n",
    "这里我们用校验集（X_val、y_val）来估计模型性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def fit_grid_point_Linear(C, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC2 =  LinearSVC( C = C)\n",
    "    SVC2 = SVC2.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC2.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.8051948051948052\n",
      "accuracy: 0.8311688311688312\n",
      "accuracy: 0.8311688311688312\n",
      "accuracy: 0.8311688311688312\n",
      "accuracy: 0.8311688311688312\n",
      "accuracy: 0.8116883116883117\n",
      "accuracy: 0.7012987012987013\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fb53db0bac8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-3, 3, 7)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份  \n",
    "#penalty_s = ['l1','l2']\n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "#    for j, penalty in enumerate(penalty_s):\n",
    "    tmp = fit_grid_point_Linear(oneC, X_train, y_train, X_val, y_val)\n",
    "    accuracy_s.append(tmp)\n",
    "\n",
    "x_axis = np.log10(C_s)\n",
    "#for j, penalty in enumerate(penalty_s):\n",
    "pyplot.plot(x_axis, np.array(accuracy_s), 'b-')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('SVM_Diabates.png' )\n",
    "\n",
    "pyplot.show()\n",
    "  \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到，线性SVM，最佳正则参数accuracy为0.83。与 Logistic 回归相比，性能更好一点。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### RBF核SVM正则参数调优\n",
    "\n",
    "RBF核是SVM最常用的核函数。\n",
    "RBF核SVM 的需要调整正则超参数包括C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和核函数的宽度gamma\n",
    "C越小，决策边界越平滑； \n",
    "gamma越小，决策边界越平滑。\n",
    "\n",
    "采用交叉验证，网格搜索步骤与Logistic回归正则参数处理类似，在此略。\n",
    "\n",
    "这里我们用校验集（X_val、y_val）来估计模型性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.svm import SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def fit_grid_point_RBF(C, gamma, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC3 =  SVC( C = C, kernel='rbf', gamma = gamma)\n",
    "    SVC3 = SVC3.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC3.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.8181818181818182\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.8376623376623377\n",
      "accuracy: 0.8506493506493507\n",
      "accuracy: 0.961038961038961\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.8311688311688312\n",
      "accuracy: 0.9025974025974026\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.8116883116883117\n",
      "accuracy: 0.9285714285714286\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-2, 2, 5)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-2, 2, 5)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train, y_train, X_val, y_val)\n",
    "        accuracy_s.append(tmp)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.7207792207792207\n",
      "accuracy: 0.8376623376623377\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.7207792207792207\n",
      "accuracy: 0.8246753246753247\n",
      "accuracy: 0.8311688311688312\n",
      "accuracy: 0.7207792207792207\n",
      "accuracy: 0.8246753246753247\n",
      "accuracy: 0.8181818181818182\n",
      "accuracy: 0.8116883116883117\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "'''C_s = np.logspace(-1, 2, 4)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-5, -2, 4)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train, y_train, X_val, y_val)\n",
    "        accuracy_s.append(tmp)'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nnHPOJfX/nqiAS+EKCmkAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fb53da81da0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy_s1 =np.array(accuracy_s).reshape(len(C_s),len(gamma_s))\n",
    "x_axis = np.log10(C_s)\n",
    "for j, gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis, np.array(accuracy_s1[:,j]), label = ' Test - log(gamma)' + str(np.log10(gamma)))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('RBF_Diabates.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
